package com.liang.rabbitmq.config;


import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;

@Configuration
public class RabbitMqConfig {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * json序列化消息
     * @return
     */
    @Bean
    public MessageConverter messageConverter(){
        return new Jackson2JsonMessageConverter();
    }

    /**
     * 定制RabbitTemplate
     * 设置确定回调
     */
    @PostConstruct  //RabbitMqConfig对象创建完成后执行这个方法
    public void setTemplate(){
        /**
         * 服务端broker受到消息就回调
         * correlationData 当前消息维系关联数据
         * b 消息是否成功收到
         * s 失败原因
         */
        rabbitTemplate.setConfirmCallback((correlationData, b, s) -> {
            System.out.println("confirm.."+correlationData+",b:"+b+",:"+s);
        });

        /**
         *
         * 只要消息没有投递给指定队列就会触发相这个失败回调
         * 投递失败的消息详细信息
         * 回复的状态码
         * 回复的文本内容
         * 当时这个消息发给哪个交换机
         * 当时这个消息用哪个路由键
         */
        rabbitTemplate.setReturnCallback((message, i, s, s1, s2) -> {
            System.out.println("return.."+message+",i:"+i+",s:"+s+",s1"+s1+",:s2"+s2);
        });

        /**
         * 消费端消息确认
         * 只要消费者消费了消息。broker才删除消息
         */


    }


}
